//app.js
import { wsURL,baseURL } from './service/config/config.js'
App({

  globalData: {
    userInfo: null,
    token:"",
    themeColor:null,
    url:baseURL,
    refreshCallback: function () { },// 全局变量刷新事件回调
    socketReceiver: function (e) {
      console.log(e, "这是收到的消息")
    }, //收到消息回调
    socketStatus: 'closed', // WebSocket 连接状态
  },
  onLaunch: function () {
    var that = this;
    if (that.globalData.socketStatus === 'closed') {
     // that.initSocket();
    }

    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo

              // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
     // 获取顶部栏信息
     wx.getSystemInfo({
      success: res => {
        //导航高度
        this.globalData.navHeight = res.statusBarHeight + 46;
        console.log(this.globalData.navHeight,"顶部导航栏高度")
      }, fail(err) {
        console.log(err);
      }
    })
  },

  /**
   * 初始化websocket
   */
  initSocket:function(){
    let that = this;

    // socket是否连接
    let socketConnected = false;

    // 待发送的消息队列
    let messageQueue = [];

    // 是否断线重连
    let reconnect = true;

    /**
     * 发送消息
     * @param {发送消息} msg 
     */
    function sendSocketMessage(msg) {
      // 如果socket已连接则发送消息
      if (socketConnected) {
        wx.sendSocketMessage({
          data: msg
        })
      } else {
        // socket没有连接将消息放入队列中
        console.log("socket没有连接将消息放入队列中")
        messageQueue.push(msg);
      }
    }

    /**
     * 关闭连接
     */
    function close() {
      if (socketConnected) {
        wx.closeSocket()
        socketConnected = false;
      }
    }

    /**
     * 符合WebSocket定义的对象
     */
    var ws = {
      send: sendSocketMessage,
      close: close
    }

    /**
     * 创建一个 WebSocket 连接
     */
    function connect() {
      wx.connectSocket({
        url: wsURL + "/wxServer",
        header: {
          token: "p-mvp" //，服务端验证token是否允许连接
        }
      })
    }
    connect();

    /**
     * 监听 WebSocket 连接打开事件
     */
    wx.onSocketOpen(function (res) {
      console.log("WebSocket 连接成功", res)
      socketConnected = true;
      ws.onopen();

      // 连接成功后，将队列中的消息发送出去
      let queueLength = messageQueue.length
      for (let i = 0; i < queueLength; i++) {
        sendSocketMessage(messageQueue.shift())
      }
    })

     // 监听 WebSocket 接受到服务器的消息事件
     wx.onSocketMessage(function (res) {
      ws.onmessage(res);
    })

     // 监听 WebSocket 错误事件
     wx.onSocketError(function (res) {
      console.log("WebSocket 错误事件", res)
      if (!socketConnected) {
        console.log("连接已断开..正在重连")
        // 断线重连
        if (reconnect) {
          connect();
        }
      }
    })

    // 监听 WebSocket 连接关闭事件
    wx.onSocketClose(function (res) {
      console.log("WebSocket 连接关闭")
      socketConnected = false;
      // 断线重连
      if (reconnect) {
        connect();
      }
    })

    const Stomp = require('/utils/stomp.js').Stomp;

    /**
     * 定期发送心跳或检测服务器心跳
     *  The heart-beating is using window.setInterval() to regularly send heart-beats and/or check server heart-beats.
     *  可看stomp.js的源码（195,207，489行），由于小程序没有window对象，所以我们要调用小程序的定时器api实现
     */
    Stomp.setInterval = function (interval, f) {
      return setInterval(f, interval);
    };

    // 结束定时器的循环调用
    Stomp.clearInterval = function (id) {
      return clearInterval(id);
    };

    const stompClient = Stomp.over(ws);

    this.globalData.socketClient = stompClient;
    stompClient.connect({}, function (callback) {
        // 向服务端发送消息时
        stompClient.send("/app/message", {}, JSON.stringify({
          'msg': '我是消费端' //that.globalData.openid
        }));

      // 订阅群发的消息
      stompClient.subscribe('/topic/greetings', function (body, headers) {
        console.log('收到服务器群发广播的消息', body);
      });

      /**
       *  订阅自己的 that.globalData.openid
       * 点对点
       */
      stompClient.subscribe('/user/12312312/p2p', function (message, headers) {
        console.log('收到只发送给我的消息(点对点):', message);
        that.globalData.socketReceiver(JSON.parse(message.body));
        // 通知服务端收到消息
        message.ack();
      });

    })
  },

  //统一发送消息
  sendSocketMessage: function (msg) {
    this.globalData.socketClient.send("/app/message", {}, JSON.stringify(msg));
  },
  
})